home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / library / createport.c < prev    next >
C/C++ Source or Header  |  1995-05-28  |  3KB  |  109 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  *  $Id: createport.c,v 1.2 1994/06/19 15:09:29 rluebbert Exp $
  20.  *
  21.  *  $Log: createport.c,v $
  22.  *  Revision 1.2  1994/06/19  15:09:29  rluebbert
  23.  *  *** empty log message ***
  24.  *
  25.  */
  26.  
  27. #define KERNEL
  28. #include "ixemul.h"
  29. #include "kprintf.h"
  30.  
  31. #include <exec/ports.h>
  32. #include <exec/interrupts.h>
  33.  
  34. struct MsgPort *
  35. CreatePort(const char *name, int pri)
  36. {
  37.   int sigBit;
  38.   struct MsgPort *port;
  39.   
  40.   if ((sigBit = AllocSignal(-1)) == -1) return 0;
  41.   
  42.   port = (struct MsgPort *) kmalloc (sizeof (struct MsgPort));
  43.   if (! port)
  44.     {
  45.       FreeSignal (sigBit);
  46.       errno = ENOMEM;
  47.       KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
  48.       return 0;
  49.     }
  50.     
  51.   bzero (port, sizeof (struct MsgPort));
  52.   
  53.   port->mp_Node.ln_Name = (char *) name;
  54.   port->mp_Node.ln_Pri = pri;
  55.   port->mp_Node.ln_Type = NT_MSGPORT;
  56.   
  57.   port->mp_Flags = PA_SIGNAL;
  58.   port->mp_SigBit = sigBit;
  59.   port->mp_SigTask = FindTask (0);
  60.   
  61.   if (name)
  62.     AddPort (port);
  63.   else
  64.     NewList (&(port->mp_MsgList));  
  65.   return port;
  66. }
  67.  
  68. struct MsgPort *
  69. CreateInterruptPort (const char *name, int pri, void (*code)(), void *data)
  70. {
  71.   struct MsgPort *port;
  72.   struct Interrupt *interrupt;
  73.   if (port = (struct MsgPort *) kmalloc (sizeof (struct MsgPort)))
  74.     {
  75.       if (interrupt = (struct Interrupt *) kmalloc (sizeof (struct Interrupt)))
  76.         {
  77.       bzero (interrupt, sizeof (struct Interrupt));
  78.  
  79.           interrupt->is_Node.ln_Type = NT_INTERRUPT;
  80.       /* as a convenience, if data is 0, set it to the port itself */
  81.           interrupt->is_Data = data ? data : port; /*rwl*/
  82.           interrupt->is_Code = code;
  83.           
  84.           bzero (port, sizeof (struct MsgPort));
  85.  
  86.       port->mp_Node.ln_Name = (char *) name;
  87.       port->mp_Node.ln_Pri = pri;
  88.       port->mp_Node.ln_Type = NT_MSGPORT;
  89.           
  90.       port->mp_Flags = PA_SOFTINT;
  91.       port->mp_SoftInt = interrupt;
  92.  
  93.  
  94.       if (name)
  95.         AddPort (port);
  96.       else
  97.         NewList (&(port->mp_MsgList));
  98.  
  99.       return port;
  100.     }
  101.       
  102.       kfree (port);
  103.     }
  104.  
  105.   errno = ENOMEM;
  106.   KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
  107.   return 0;
  108. }
  109.